#include "Humain.h"

using namespace std;
using namespace boost::assign;

const unsigned int Humain::ens = 0;

const unsigned int Humain::nbr_comp = 0;

const unsigned int Humain::taille = 4;

const vector< ListCapa > Humain::Liste = list_of
  (ListCapa("Agressivité"      ,  5))
  (ListCapa("PV supplémentaire", 10))
  (ListCapa("Portes secrètes"  , 10))
  (ListCapa("Solidité"         ,  5));

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 * @param cap conteneur des capacité
 */
Humain::Humain(vector<unsigned int> cap)
  :Race("Humain")
{
  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  NombreTotalEnsembles = ens;
  NombreMaxCapacites   = nbr_comp;

  capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Demi-Elfe en sélectionnant
 * ses capacités.
 * @param PP nombre de pp, passé en argument afin de pouvoir récupéré les
 * pp non dépensé
 */
Humain::Humain(unsigned int& PP)
  :Race("Humain")
{
  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  NombreTotalEnsembles = ens;
  NombreMaxCapacites   = nbr_comp;

  blank() << setfill('*') << setw(56) << '*' << endreq;
  blank() << "Création d'un humain" << endl << endreq;
  PP += 10;

  construitRace( PP );

//   unsigned int nbr(0);
//   bool test(true), deja_pris, encore(false);
//   PP = 10;
//   do
//     {
//       blank() << "Tu as " << PP << " pp à dépenser" << endreq;
//       for (unsigned int i(0); i < taille; i++)
// 	blank() << i+1 << ' ' << (Liste[i].Capa)
// 		    << " (" << Liste[i].Cout << " pp)" << endreq;
//       blank() << taille + 1 << " Aucune" << endreq;
//       blank() << "Choisir les capacités raciales" << endreq;
//       while(test)
// 	{
// 	  nbr = demanderUnsignedBorne("("+ecrireString(PP)+" pp restants) ",
// 					1, taille + 1);
// 	  if (nbr != taille + 1)
// 	    {
// 	      if (PP >= Liste[nbr-1].Cout)
// 		{
// 		  deja_pris = safePushBack(&capacites, nbr - 1);
// 		  if (deja_pris)
// 		    warning() << "Déjà sélectionné" << endreq;
// 		  else
// 		    {
// 		      PP -= Liste[nbr-1].Cout;
// 		      capacites.push_back(nbr-1);
// 		      blank() << "Capacité choisie : "
// 				  << (Liste[nbr-1].Capa) << endreq;
// 		    }
// 		}
// 	      else
// 		blank() << "Pas assez de pp" << endreq;
// 	    }
// 	  else
// 	    test = false;
// 	}
      
//       afficheInfo();
//       blank() << endl <<  "1 pour continuer, 2 pour recommencer" << endreq;
//       nbr = demanderUnsignedBorne("Choix ", 1, 2);
//       if (nbr == 2)
// 	{
// 	  PP = 10;
// 	  capacites.clear();
// 	  test = true;
// 	  encore = true;
// 	  blank() << endreq;
// 	}
//       else
// 	encore = false;
//     }
//   while(encore);

  blank() << endl << setfill('*') << setw(56) << '*' << endreq;
}

Humain::Humain()
  :Race("Humain")
{
  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  NombreTotalEnsembles = ens;
  NombreMaxCapacites   = nbr_comp;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param ptr pointeur sur l'instance à copier.
 */
Humain::Humain(Race *ptr )
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Humain::~Humain()
{}

// /**
//  * Affiche la race et les capacités
//  */
// void Humain::affiche_info(ostream& os)
// {
//   os << "Race : " << Type << endreq;
//   for (unsigned int i(0); i<capacites.size(); i++)
//     os << (Liste[capacites[i]].Capa) << endreq;
// }

// /**
//  * Retrouve la capacité voulue.
//  * @param i le numéro de la capacité
//  * @return la capacité (string)
//  */
// string Humain::get_capacite(const unsigned int& i) const
// {
//   return (Liste[get_capa(i)].Capa);
// }

// void Humain::get_capacites(unsigned int& nbr, vector<ListCapa> &capa) const
// {
//   nbr = taille;

//   capa.clear();

//   for (unsigned int i(0); i < taille; i++)
//     capa.push_back(Liste[i]);
// }


// void Humain::get_ensemble_racial(unsigned int& nbr, unsigned int& max) const
// {
//   nbr = 0;
//   max = 0;
// }

// const unsigned int* Humain::get_ensemble_racial(const unsigned int& nbr) const
// {
//   return 0;
// }
